#pragma once

#include <iostream>
#include <cstdlib>
#include <string>

const std::string pathname = "/home/whb/109/109/lesson30";
const int proj_id = 0x11223344;

// 共享内存的大小，强烈建议设置成为n*4096（也就是4096的整数倍），因为共享内存的开辟都是以4096字节为单位开辟的，如果申请4097
// 那么操作系统也只能是按照4096*2来分配，但是显示出来的是4097，实际上也只给用4097
const int size = 4096; // 4096*2

key_t GetKey()
{
    key_t key = ftok(pathname.c_str(), proj_id);//一个把文件名转换为相应的key值的算法，这样不会轻易导致数值重复
    if(key < 0)//上面函数失败的返回值为-1
    {
        std::cerr << "errno: " << errno << ", errstring: " << strerror(errno) << std::endl;
        exit(1);//连标识符都没有就没必要继续了
    }

    return key;
}

std::string ToHex(int id)
{
    char buffer[1024];
    snprintf(buffer, sizeof(buffer), "0x%x", id);
    return buffer;
}

int CreateShmHelper(key_t key, int flag)
{
    int shmid = shmget(key, size, flag);//创建共享内存，不成功就返回-1
    if(shmid < 0)
    {
        std::cerr << "errno: " << errno << ", errstring: " << strerror(errno) << std::endl;
        exit(2);//创建失败就直接退出
    }

    return shmid;
}

int CreateShm(key_t key)//创建共享内存
{
    return CreateShmHelper(key, IPC_CREAT|IPC_EXCL|0644);//0664是给共享内存设置的权限
}

int GetShm(key_t key)//获取共享内存，与上面的只有参数差别
{
    return CreateShmHelper(key, IPC_CREAT/*0也可以*/);
}
